package collection;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class MyArrayList {
    private int[] data;       //用来存放数据
    private int initCapacity; //初始的容量
    private int size;         //数据的数量,也可以理解成开始没有存数据的位置下标

    public MyArrayList() {
        this(10);  //默认初始容量是10
    }

    public MyArrayList(int initCapacity) {
        this.initCapacity = initCapacity; //可以任意指定初始容量
        this.data = new int[0];  //先初始化一个0长度的数组(不占内存), 第一次添加数据时再
    }

    /*新增方法*/
    public void add(int value) {
        ensureCapacity(); //确认数组容量，若果容量不足，1.5倍扩容
        data[size] = value; //size总是指向数据后面的一个空位置
        size++;
    }

    private void ensureCapacity() {
        if (data.length == 0) { //最初初始化的0长度数组
            data = new int[this.initCapacity]; //重新初始化一个initCapacity长度的数组
            return;
        }
        if (size >= data.length) { //数组已经放满
            //新长度是原来的1.5倍   + >>,加号会先运算,所以要加括号
            int newCapacity = data.length + (data.length >> 1);//右移除以2
            this.data = Arrays.copyOf(data, newCapacity);//原数组复制一个新的数组
        }

    }


    public int get(int index) {
        jianChaXiaBiao(index); //检查下标有没有越界
        return data[index];
    }

    private void jianChaXiaBiao(int index) {
        if (index < 0 || index >= size) { //访问的位置超出数组位置
            throw new IndexOutOfBoundsException("下标越界");
        }
    }

    public int size() {
        return this.size; //返回添加的数据数量
    }

    public void remove(int index) {
        jianChaXiaBiao(index);  //检查下标有没有越界
        if (index == size-1) {  //删除size前面一个位置
            size--;             //直接向前移动size
            return;
        }
        //删除前面的数据，index+1到size-1位置的数据，向前复制一位
        System.arraycopy(data, index+1, data, index, size-index-1);
        size--; //数据数量减1
    }

    public void set(int index, int value) {
        jianChaXiaBiao(index);  //检查下标有没有越界
        data[index] = value;    //把index位置的值替换成新的值
    }


    public static void main(String[] args) {
        MyArrayList list = new MyArrayList();
        for (int i = 0; i < 18; i++) {
            list.add(i);
        }

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("数组的长度"+list.data.length);
        System.out.println("---------------------------");
        list.remove(4);
        list.remove(12);
        System.out.println("数组的长度"+list.data.length);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        System.out.println("----------------------------");

        list.set(5,89);
        System.out.println(list.get(5));

    }

}
